package com.qh.xx;

import com.qh.file.Files;
import com.qh.printer.BinaryTrees;

import java.util.Comparator;

/**
 * @description:
 * @author: zqh
 * @date: 2021/11/5 22:26
 **/
public class Main {

    // private static class PersonComparator implements Comparator<Person> {
    //     @Override
    //     public int compare(Person e1, Person e2) {
    //         return e1.getAge() - e2.getAge();
    //     }
    // }
    // private static class PersonComparator2 implements Comparator<Person>{
    //     @Override
    //     public int compare(Person e1, Person e2) {
    //         return e2.getAge() - e1.getAge();
    //     }
    // }

    static void test1() {
        // Integer data[] = new Integer[] {
        //         7, 4, 9, 2, 5, 8, 11, 3, 12, 1
        // };
        //
        // BinarySearchTree<Integer> bst = new BinarySearchTree<>();
        // for (int i = 0; i < data.length; i++) {
        //     bst.add(data[i]);
        // }
        //
        // BinaryTrees.println(bst);

        // BinarySearchTree<Person> bst2 = new BinarySearchTree<>(new PersonComparator());
        // BinarySearchTree<Person> bst2 = new BinarySearchTree<>();
        // bst2.add(new Person(1));
        // bst2.add(new Person(2));
        // bst2.add(new Person(3));
        // bst2.add(new Person(4));
        //
        // BinaryTrees.println(bst2);
        //
        // BinarySearchTree<Person> bst3 = new BinarySearchTree<>(new PersonComparator2());
        // bst2.add(new Person(12));
        // bst2.add(new Person(15));

        //匿名类
        BinarySearchTree<Person> bst4 = new BinarySearchTree<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o2.getAge() - o1.getAge();
            }
        });
        bst4.add(new Person(111));
        bst4.add(new Person(22));
        bst4.add(new Person(3333));
        bst4.add(new Person(4));
        BinaryTrees.println(bst4);

       // BinarySearchTree<Car> car = new BinarySearchTree<>();
       // car.add(new Car(1));
       // car.add(new Car(2));
       // car.add(new Car(3));
       // car.add(new Car(4));
       // BinaryTrees.println(car);

        // BinaryTrees.println(bst);
    }

    static void test3() {
        BinarySearchTree<Integer> bst = new BinarySearchTree<>();
        for (int i = 0; i < 40; i++) {
            bst.add((int)(Math.random() * 100));
        }

        String str = BinaryTrees.printString(bst);
        str += "\n";
        Files.writeToFile("F:/1.txt", str, true);

        // BinaryTrees.println(bst);
    }

    static void test6() {
        Integer data[] = new Integer[] {
                7, 4, 9, 2, 5
        };

        BinarySearchTree<Integer> bst = new BinarySearchTree<>();
        for (int i = 0; i < data.length; i++) {
            bst.add(data[i]);
        }

//		BinarySearchTree<Integer> bst = new BinarySearchTree<>();
//		for (int i = 0; i < 10; i++) {
//			bst.add((int)(Math.random() * 100));
//		}
//         BinaryTrees.println(bst);
        // bst.preorderTraversal();
        // bst.inorderTraversal();
        // bst.postorderTraversal();
        // bst.levelOrderTraversal();


        // bst.levelOrder(new BinarySearchTree.Visitor<Integer>() {
        //     @Override
        //     public void visit(Integer element) {
        //         System.out.print("_" + element + "_");
        //     }
        // });

        // bst.inorder(new BinarySearchTree.Visitor<Integer>() {
        //     @Override
        //     public boolean visit(Integer element) {
        //         System.out.print("_" + element + "_");
        //         // return false;
        //         return element == 5 ? true : false;
        //     }
        // });

        System.out.println(bst.isComplete());

        // System.out.println(bst.isComplete());

        // bst.levelOrderTraversal();

		/*
		 *       7
		 *    4    9
		    2   5
		 */

//		bst.levelOrder(new Visitor<Integer>() {
//			public void visit(Integer element) {
//				System.out.print("_" + element + "_ ");
//			}
//		});

//		bst.inorder(new Visitor<Integer>() {
//			public void visit(Integer element) {
//				System.out.print("_" + (element + 3) + "_ ");
//			}
//		});

        // System.out.println(bst.height());
    }

    public static void main(String[] args) {
        // test1();
        test6();

    }
}
